package com.hzy.pay.wxpay.service;

import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.result.*;
import com.hzy.pay.wxpay.bean.WeixinpayException;

/**
 * 微信支付服务
 * 
 * @author zhuowei.luo
 * @date 2018/7/12
 */
public interface WeixinpayApiService {

    /**
     * NATIVE 扫码支付
     *
     * 生成ur，url再生成二维码供用户扫码
     *
     * @param body 商家名称-销售商品类目
     * @param outTradeNo 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|* 且在同一个商户号下唯一
     * @param totalFee 订单总金额 单位元
     * @param spbillCreateIp 支持IPV4和IPV6两种格式的IP地址
     * @param productId 商品ID
     * @return
     * @throws Exception
     */
    public String createNativeOrder(String body, String outTradeNo, String totalFee, String spbillCreateIp, String productId) throws Exception;

    /**
     * JSAPI 点击支付
     *
     * 调用该方法获取WxPayMpOrderResult参数返回给前台js，js根据参数调用支付方法
     *
     * @param body 商家名称-销售商品类目
     * @param outTradeNo 商户系统内部订单号，要求32个字符内
     * @param totalFee 订单总金额 单位元
     * @param spbillCreateIp 支持IPV4和IPV6两种格式的IP地址
     * @param openid 微信用户的唯一标识，可以通过授权获取用户信息得到
     * @return
     * @throws Exception
     */
    public WxPayMpOrderResult createJSAPIOrder(String body, String outTradeNo, String totalFee, String spbillCreateIp, String openid) throws Exception;

    /**
     * APP 安卓、ios支付
     *
     * 调用该方法获取WxPayAppOrderResult参数返回给安卓、ios
     *
     * @param body 商家名称-销售商品类目
     * @param outTradeNo 商户系统内部订单号，要求32个字符内
     * @param totalFee 订单总金额 单位元
     * @param spbillCreateIp 支持IPV4和IPV6两种格式的IP地址
     * @return
     * @throws Exception
     */
    public WxPayAppOrderResult createAPPOrder(String body, String outTradeNo, String totalFee, String spbillCreateIp) throws Exception;

    /**
     * H5 支付
     *
     * 生成ur，url再生成二维码供用户扫码
     *
     * @param body 商家名称-销售商品类目
     * @param outTradeNo 商户系统内部订单号，要求32个字符内
     * @param totalFee 订单总金额 单位元
     * @param spbillCreateIp 支持IPV4和IPV6两种格式的IP地址
     * @return
     * @throws Exception
     */
    public String createMWEBOrder(String body, String outTradeNo, String totalFee, String spbillCreateIp) throws Exception;
	

	/**
	 * 订单查询
	 *
     * @param outTradeNo 商户系统内部的订单号
	 * @desc 商户可以通过该接口主动查询订单状态，完成下一步的业务逻辑
	 */
	public WxPayOrderQueryResult orderQuery(String outTradeNo) throws WeixinpayException;
	
	/**
	 * 关闭订单 
	 *
     * @param outTradeNo 商户系统内部的订单号
     *
	 * @desc 用于交易创建后，用户在一定时间内未进行支付，可调用该接口直接将未付款的交易进行关闭；<br>
	 * 	               商户订单支付失败需要生成新单号重新发起支付，要对原订单号调用关单，避免重复支付；<br>
	 * 	               系统下单后，用户支付超时，系统退出不再受理，避免用户继续，请调用关单接口。
	 */
	public WxPayOrderCloseResult closeOrder(String outTradeNo) throws WeixinpayException;
	
    /**
     * 退款
     * @param outTradeNo 商户系统内部的订单号
     * @param outRefundNo 商户系统内部的退款单号，商户系统内部唯一
     * @param totalFee 订单总金额
     * @param refundFee 退款金额
     * @return
     * @throws WeixinpayException
     * @desc 一笔退款失败后重新提交，请不要更换退款单号，请使用原商户退款单号。
     */
	public WxPayRefundResult refund(String outTradeNo, String outRefundNo, String totalFee, String refundFee) throws WeixinpayException;
	
	/**
	 * 退款查询 
	 * @param outTradeNo 商户系统内部的订单号
	 * @desc 提交退款申请后，通过调用该接口查询退款状态。<br>
	 *       退款有一定延时，用零钱支付的退款20分钟内到账，银行卡支付的退款3个工作日后重新查询退款状态。
	 */
	public WxPayRefundQueryResult refundQuery(String outTradeNo) throws WeixinpayException;

    /**
     * 下载对账单
     * @param billDate 下载对账单的日期，格式：20140603
     * @param billType ALL（默认值），返回当日所有订单信息（不含充值退款订单）
     *                 SUCCESS，返回当日成功支付的订单（不含充值退款订单）
     *                 REFUND，返回当日退款订单（不含充值退款订单）
     *                 RECHARGE_REFUND，返回当日充值退款订单
     * @return
     * @throws WeixinpayException
     */
	public WxPayBillResult downloadBill(String billDate, String billType) throws WeixinpayException;
}
